home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1994
/
MacHack 1994.toast
/
MacHack™94
/
Talks & Papers
/
Timothy Knox
/
Help
/
Help Files
/
ATMS
/
• v 1.6
< prev
next >
Wrap
Text File
|
1994-06-24
|
9KB
|
252 lines
{differences avec v 1.5: Fonctions en assembleur}
(warn ƒ
(define (just l)
(warn () (raz))
(let [(ls&ns (creer…ls&ns l 0))]
(define *ts* (apply cell (0 ls&ns)))
(define *ns* (1 ls&ns))
(just…*tc* l)))
(define (just…*tc* l)
(let [(lc&nsmax (creer…lc&nsmax l *ns* 'dk))]
(define *tc* (apply cell (0 lc&nsmax)))
(define *nc* (1- (blength *tc*)))
(define *nsmax* (1 lc&nsmax))
(just…*tc/s&*tc/nxx* l)))
(define (just…*tc/s&*tc/nxx* l)
(letrec [((init…tc/s i t)
(cond (>? i *ns*) t
(begin (cell=! t i (cell (makebitarray *nc*)(makebitarray *nc*)))
(init…tc/s (1+ i) t))))
((init…tc/nxx i t)
(cond (>? i *nsmax*) t
(begin (cell=! t i (makebitarray *nc*))
(init…tc/nxx (1+ i) t))))
(tc/s&tc/nxx (creer…tc/s&tc/nxx (init…tc/s 0 (makecell (1+ *ns*) 0))
(init…tc/nxx 0 (makecell (+ *nsmax* 1) 0))
(init…tc/nxx 0 (makecell (+ *nsmax* 1) 0))
*tc*))
(tc…s-> (bitand (1 (1 tc/s&tc/nxx)) (0 (2 tc/s&tc/nxx))))
(tc…->s (bitand (0 (1 tc/s&tc/nxx)) (1 (2 tc/s&tc/nxx))))]
(define *tc/s* (0 tc/s&tc/nxx))
(define *msk* (bitnot! (makebitarray *nc*)))
(define *a->b* (avancer! pg *tc/s* *tc* (trouver…ts! *tc* tc…->s pd)
(1 tc/s&tc/nxx) (2 tc/s&tc/nxx) *msk*
(avancer! pd *tc/s* *tc* (trouver…ts! *tc* tc…s-> pg)
(1 tc/s&tc/nxx) (2 tc/s&tc/nxx) *msk*
(cell (makebitarray *ns*) (makebitarray *ns*)))))
(define *tc/nsg* (1 tc/s&tc/nxx))
(define *tc/nsd* (2 tc/s&tc/nxx))))
(define (creer…ls&ns lc n)
(cond (null? lc) (cell () n)
(letrec [((loop ls n l&n)
(cond (null? ls) (cell n l&n)
(let [(s (intern 'dk (0 ls)))]
(cond (warn () (error? (binding=? s ())))
(begin (binding=! s () n)
(let [(etc (loop (-1 ls) (1+ n) l&n))]
(cell (0 etc) (cell (cons (0 ls) (0 (1 etc))) (1 (1 etc))))))
(loop (-1 ls) n l&n)))))
(respg (loop (pg (0 lc)) n
(letrec [(respd (loop (pd (0 lc)) (0 respg)
(creer…ls&ns (-1 lc) (0 respd))))]
(1 respd))))]
(1 respg))))
{••• Traduit une liste de symboles en un vecteur de bits en fonction du package dk}
(defext ":Help Files:ATMS:fo" "traduire" traduire
(cell 'traduire ())
%111 l ba dk)
(defext ":Help Files:ATMS:fo" "creer…lc&nsmax" creer…lc&nsmax
(cell 'creer…lc&nsmax (getcode traduire) () ƒ (getcode bitcount)(getcode bcopy)(getcode bitand!)(getcode bitfind))
%111 l ns dk)
{••• bitfind et bitclr a la fois, retourne le rang}
(defext ":Help Files:ATMS:fo" "bitfclr!" bitfclr!
(cell 'bitfclr! ƒ)
%1 x)
(defext ":Help Files:ATMS:fo" "creer…tc/s&tc/nxx" creer…tc/s&tc/nxx
(cell 'creer…tc/s&tc/nxx (getcode bitfclr!) () ƒ (getcode BCopy)(getcode BitCount))
%1111 tc/s tc/nsg tc/nsd tc)
{••• Ajoute une clause dans une liste de clauses sans verification des soussommages
*tc* se retrouve dans l'ordre par rapport a la liste initiale}
(define consminimal cons)
{••• Affecte ? aux *ns* symboles de *ts* dans le package dk}
(define (raz)
(cond (warn ƒ (error? *ts*)) †
(letrec [(ns (1- (blength *ts*)))
((loop n)
(cond (=? n ns) †
(begin (binding=! (intern 'dk (n *ts*)) () (warn ƒ ?))
(loop (1+ n)))))]
(loop 0))))
{••• Extraordinaire barriere d'abstraction: pg partie gauche et pd partie droite}
(define pg 0)
(define pd 1)
{•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••}
(define (• lhs rhs)
(letrec
[(a (traduire lhs (makebitarray *ns*) 'dk))
(b (traduire rhs (makebitarray *ns*) 'dk))
(msk (bcopy *msk*))
(tc/nsg (bcopy *tc/nsg*))
(tc/nsd (bcopy *tc/nsd*))
(a->b (avancer! pg *tc/s* *tc* a tc/nsg tc/nsd msk
(avancer! pd *tc/s* *tc* b tc/nsg tc/nsd msk (ccopy *a->b*))))
(rangtt (explorer tc/nsg tc/nsd msk))]
(cond (eq? a->b †) †
(and (bitfind (0 tc/nsg)) rangtt)
(prouver…ts (bitmsk (pg (rangtt *tc*)) (pg a->b)) tc/nsg tc/nsd msk a->b *tc/s* *tc*))))
{••• retourne dans res le tas de symboles apparaissant dans la partie goud des clauses de tc}
(defext ":Help Files:ATMS:fo" "trouver…ts!" trouver…ts!
(cell 'trouver…ts! (getcode BitFClr!)(getcode BitOr!) ƒ ())
%111 *tc* tc goud)
{•••retourne le rang de la clause de tete entrainant le plus faible facteur de branchement ou ƒ}
(defext ":Help Files:ATMS:fo" "explorer" explorer
(cell 'explorer (getcode BCopy)(getcode BitAnd!)(getcode BitFind) () ƒ)
%111 tc/nsg tc/nsd msk)
{••• avance d'un cran les clauses de tc dans tc/nxx}
(defext ":Help Files:ATMS:fo" "avancer!tc" avancer!tc
(cell 'avancer!tc (getcode BitFind)(getcode BitOr!)(getcode BitAnd!)(getcode BitNot!)(getcode BCopy) ƒ ())
%11 tc tc/nxx)
{•••reclasse les clauses dans tc/nsg et tc/nsd,
en avancant dans tc/nsg (tc/nsd) les clauses qui contiennent le symbole a goud d'un cran,
en mettant a jour le msk ie eteindre les bits des clauses qui contiennent le symbole a doug
en appelant avancer! a gauche pour les symboles s dans les clauses ->s qui sont ainsi apparues
en appelant avancer! a droite pour les symboles s dans les clauses s-> qui sont ainsi apparues
Elle travaille physiquement sur chacun des tableaux et retourne a->b
L'appeler toujours avec tc=*tc* et tcs=*tc/s*}
(defext ":Help Files:ATMS:fo" "avancer!" avancer!
(cell 'avancer! (getcode avancer!tc) (getcode bitfclr!)(getcode trouver…ts!)
† ƒ () (getcode Bitand!)(getcode BitOr!)(getcode BitFind)(getcode BCopy)(getcode BitNot!))
%11111111111 goud tcs tc ts tc/nsg tc/nsd msk a->b)
{•••prouve les clauses a->gb pour tout g de gamma
L'appeler toujours avec tc=*tc* et tcs=*tc/s*}
(defext ":Help Files:ATMS:fo" "prouver…ts" prouver…ts
(cell 'prouver…ts (getcode avancer!)(getcode bitfclr!)(getcode explorer)
(getcode Print)(getcode BitFind)(getcode BitOr!)(getcode BitAnd!)
(getcode BitNot!)(getcode BCopy) ƒ () †)
%1111111 gamma old…tc/nsg old…tc/nsd old…msk old…a->b tcs tc)
{••• un pretty print pour le rang d'une clause}
(define (ppc rang)
(cond rang (let [(c (rang *tc*))]
(cell (ppts (pg c)) (ppts (pd c))))
"Pas de regle"))
{••• un pretty print pour un vecteur de bits representant un ensemble de clauses}
(define (pptc p)
(letrec [(ba (bcopy p))
((loop rang)
(cond rang (cond (>? rang *nc*) ()
(cons (ppc rang) (loop (bitfclr! ba))))
()))]
(loop (bitfclr! ba))))
{••• un pretty print pour le rang d'un symbole}
(define (pps rang)
(cond rang (rang *ts*)
"Pas de symbole"))
{••• un pretty print pour un vecteur de bits representant un ensemble de symboles}
(define (ppts p)
(letrec [(ba (bcopy p))
((loop rang)
(cond rang (cons (rang *ts*) (loop (bitfclr! ba)))
()))]
(loop (bitfclr! ba))))
(define (max n | l)
(cond (null? l) n
(<? n (0 l)) (apply max l)
(apply max (cons n (-1 l)))))
(defmacro (bitmsk x y)
`(bitand! ,x (bitnot! (bcopy ,y))))
(defmacro (bitand x y)
`(bitand! ,x (bcopy ,y)))
(defmacro (bitor x y)
`(bitor! ,x (bcopy ,y)))
(defmacro (bitnot x)
`(bitnot! (bcopy ,x)))
(defmacro (ccopy a->b)
`(cell (bcopy (pg ,a->b)) (bcopy (pd ,a->b))))
{accede a la valeur d'une forme suspendue si la structure en est simple.
Attention: Pour un cell, elle n'accede pas a chaque element}
(defmacro (accede | l)
(cons 'begin (maplist 'null? l)))
{Imprime en sequence par prin les elements de l et retourne la valeur du premier arg}
(defmacro (prinloop val | l)
`(begin ,@(maplist 'prin l) (flushio stdo) ,val))
{le stepper s'arrete pour les ident de variables, les cons, les fermetures}
(define (step? expr env)
(or (=? (type expr) 6)
(=? (type expr) 12)
(=? (type expr) 13)
))
(defmacro (mapause | l)
`(begin ,@(maplist 'prin l) (flushio stdo) (pause))
)
(defmacro (mapause | l) ()
)
(define (maplist f l)
(cond (null? l) ()
(cons (list f (0 l)) (maplist f (-1 l)))))
(define (instance pg pd lvar ldom test)
(letrec [((loopvar lvar ldom)
(cond (null? lvar) (cond (eval test ()) (prin (cell (eval pg ()) (eval pd ()))))
(loopval (0 lvar) (0 ldom) (-1 lvar) (-1 ldom))))
((loopval var dom lvar ldom)
(cond (cons? dom) (begin (binding=! var () (0 dom))
(loopvar lvar ldom)
(loopval var (-1 dom) lvar ldom))))]
(loopvar lvar ldom) (flushio stdo)))
(define (inverser l)
(cond (null? l) ()
(cons (cell (1 (0 l)) (0 (0 l))) (inverser (-1 l)))))
)